package com.gitee.jisong.kit;

import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.List;

/**
 * @author sunjisong 2019-07-16
 */
public class ListKit {

    public static boolean isEmpty(List list) {
        return null == list || list.size() <= 0;
    }


    /**
     * 自己实现的，返回arrayList
     *
     * pading empty list , avoid OutOfBoundException
     *
     * 因为会有转ArrayList的开销,性能不比 partition, 量少使用区别不大
     * @param list
     * @param total
     * @param <T>
     * @return
     */
    public static <T> List<List<T>> splite(List<T> list, Integer total){
        List<List<T>> res = new ArrayList<>();
        if(isEmpty(list)){
            return res;
        }
        if(total == null || total <= 1){
            res.add(list);
            return res;
        }
        int size = list.size();
        int pageSize = size / total;
        if(size % total > 0){
            pageSize ++ ;
        }
        for(int start = 0; start < size ; start += pageSize){
            int end = Math.min(start + pageSize , size);
            List<T> subList = new ArrayList<>(list.subList( start, end));
            res.add(subList);
            start = end;
        }
        while(res.size() < total){
            res.add(new ArrayList<>(0));
        }
        return res;
    }

    /**
     * guava 实现，返回的是subList
     * subList 不可写操作，不然会修改源数据，
     * subList 只是源数据的引用
     *
     * 只有get()\ size() , 没有其他方法,使用谨慎 , 性能好
     * ***[延迟加载 , 只有在get时,才会真正执行切分]
     * @param list
     * @param total
     * @param <T>
     * @return
     */
    public static <T> List<List<T>> partition(List<T> list,Integer total){
        List<List<T>> res = new ArrayList<>();
        if(isEmpty(list)){
            return res;
        }
        if(total <= 1){
            res.add(list);
            return res;
        }
        int size = list.size();
        int pageSize = size / total;
        if(size % total > 0){
            pageSize ++ ;
        }
        List<List<T>> partition = Lists.partition(list, pageSize);
        return partition;
    }
}
